package com.mezz.bones.im.common.util;

import cn.hutool.core.util.StrUtil;
import com.mezz.bones.im.common.constants.MessageConstants;
import com.mezz.bones.im.common.enums.ChannelTypeEnum;
import com.mezz.bones.im.common.enums.RelationTypeEnum;
import com.mezz.bones.im.common.enums.UserTypeEnum;
import com.mezz.bones.im.common.exception.ImBaseException;
import com.mezz.bones.im.common.domain.msg.ConversationIdBo;
import com.mezz.bones.im.common.result.ImResultCode;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Author: zhuang
 * @Date: 2025/1/25 16:05
 * @Description: TODO
 * @Version: 1.0
 **/

public class MessageUtil {

    private static final AtomicInteger sequence = new AtomicInteger(1);
    private static final int MAX_SEQUENCE = 99999999;

    /**
     * @param userType 用户类型
     * @param peerType 对端用户类型
     * @return
     */
    public static String channelType(String userType, String peerType) {

        UserTypeEnum user = UserTypeEnum.USER;
        UserTypeEnum srm = UserTypeEnum.SRM;
        UserTypeEnum saas = UserTypeEnum.SAAS;

        //发送端是用户
        if (user.getCode().equals(userType)) {

            if (user.getCode().equals(peerType)) {
                return ChannelTypeEnum.USER2USER.getCode();
            }

            if (srm.getCode().equals(peerType)) {
                return ChannelTypeEnum.USER2SRM.getCode();
            }

            if (saas.getCode().equals(peerType)) {
                return ChannelTypeEnum.USER2SAAS.getCode();
            }
        }

        //发送端是srm
        if (srm.getCode().equals(userType)) {

            if (user.getCode().equals(peerType)) {
                return ChannelTypeEnum.USER2SRM.getCode();
            }

            if (saas.getCode().equals(peerType)) {
                return ChannelTypeEnum.SRM2SAAS.getCode();
            }
        }

        //发送端是saas
        if (saas.getCode().equals(userType)) {

            if (srm.getCode().equals(peerType)) {
                return ChannelTypeEnum.SRM2SAAS.getCode();
            }

            if (user.getCode().equals(peerType)) {
                return ChannelTypeEnum.USER2SAAS.getCode();
            }
        }


        throw new ImBaseException(ImResultCode.PARAM_ERROR, StrUtil.format("channelType error userType={}, peerType={}", userType, peerType));
    }

    /**
     * @param userType   发送端类型
     * @param peerType   接收端类型
     * @param relationId 关联id(客服业务相关)
     * @return
     */
    public static Integer relationType(String userType, String peerType, String relationId) {

        if (MessageConstants.NON_AGENT_MESSAGE_RELATION_ID.equals(relationId)) {
            return MessageConstants.NON_AGENT_MESSAGE_RELATION_TYPE;
        }

        UserTypeEnum user = UserTypeEnum.USER;
        UserTypeEnum srm = UserTypeEnum.SRM;
        UserTypeEnum saas = UserTypeEnum.SAAS;

        //子号类型 都是 被服务方 → 客服方
        if (user.getCode().equals(userType)) {
            //用户 发送消息 给供应商客服/平台客服 userId=用户ID peerId=供应商ID/平台ID(0) relationId=子号 客服信息-供应商客服/平台客服
            return RelationTypeEnum.SUB.getCode();
        }

        if (srm.getCode().equals(userType) && saas.getCode().equals(peerType)) {
            //供应商 发送消息 给平台客服 userId=供应商客服ID peerId=0 relationId=子号 平台客服ID
            return RelationTypeEnum.SUB.getCode();
        }

        //母号类型 都是 客服方 → 被服务方
        if (srm.getCode().equals(userType) && user.getCode().equals(peerType)) {
            //供应商客服 发送消息 给用户 userId=供应商客服ID peerId=用户ID relationId=母号供应商ID
            return RelationTypeEnum.MAIN.getCode();
        }

        if (saas.getCode().equals(userType) && user.getCode().equals(peerType)) {
            //平台客服 发送消息 给用户 userId=平台客服ID peerId=用户ID relationId=母号 平台(平台默认的relationId是0)
            return RelationTypeEnum.MAIN.getCode();
        }

        if (saas.getCode().equals(userType) && srm.getCode().equals(peerType)) {
            //平台客服 发消息 给供应商客服 userId=平台客服 peerId=供应商ID relationId=母号 平台(平台默认的relationId是0)
            return RelationTypeEnum.MAIN.getCode();
        }

        throw new ImBaseException(ImResultCode.PARAM_ERROR, StrUtil.format("relationType error relationId={},userType={},peerType={}", relationId, userType, peerType));
    }


    /**
     * @param userId       所属用户ID
     * @param peerId       对端用户ID
     * @param relationId   客服业务关联ID
     * @param relationType 客服业务关联类型
     * @return 对端的会话主键信息
     */
    public static ConversationIdBo peerConversationIdBoInfo(String userId, String peerId,  String relationId, Integer relationType) {

        if (MessageConstants.NON_AGENT_MESSAGE_RELATION_TYPE.equals(relationType)) {
            return ConversationIdBo.builder()
                    .userId(peerId)
                    .peerId(userId)
                    .build();
        }

        if (RelationTypeEnum.SUB.getCode().equals(relationType)) {
            //如果发送端是 被服务方 存的是客服ID信息
            //被服务方 供应商/平台 供应商/平台客服ID
            //供应商/平台客服ID 被服务方 供应商/平台
            return ConversationIdBo.builder()
                    .userId(relationId)
                    .peerId(userId)
                    .build();
        }

        if (RelationTypeEnum.MAIN.getCode().equals(relationType)) {
            //如果发送端是 客服方 存的是客服对应的主体ID 供应商ID/平台ID
            //供应商/平台客服ID 被服务方 供应商/平台
            //被服务方 供应商/平台 供应商/平台客服ID
            return ConversationIdBo.builder()
                    .userId(peerId)
                    .peerId(relationId)
                    .build();
        }


        throw new ImBaseException(ImResultCode.PARAM_ERROR, StrUtil.format("peerConversationIdBoInfo error userId={} peerId={} relationId={} relationType={}", userId,peerId,relationId,relationType));
    }
    
    /**
     * 生成消息序列号
     * 格式：毫秒时间戳 + 8位数字（不足补0）
     * @return 消息序列号
     */
    public static String generateMessageSeq() {
        int currentSeq = sequence.getAndUpdate(current -> {
            if (current >= MAX_SEQUENCE) {
                return 1;
            }
            return current + 1;
        });
        
        return System.currentTimeMillis() + String.format("%08d", currentSeq);
    }
}
